#include <stdio.h>
#include <iostream>

using std::cout;
using std::endl;

int gNum;//全局变量,位于全局区，会初始化为默认值
int *pi;//全局变量，全局指针
const int icc = 10;//全局的常量,靠近文字常量区

int main(int argc, char *argv[])
{
    const int icc2 = 20;//局部常量,位于栈区
    int num;//局部变量,位于栈区，随机值
    int *pa;//局部变量
    //pInt本身位于栈区,指向的变量位于堆区
    int *pInt = new int(10);
    pa = &num;

    static int ic = 10;//静态区

    //pstr本身位于栈区
    //pstr指向的变量位于文字常量区
    const char *pstr = "hello,world";//字符串常量

    printf("\n打印变量的地址\n");
    printf("&gNum = %p\n", &gNum);
    printf("&pi = %p\n", &pi);
    printf("pi = %p\n", pi);
    printf("&num = %p\n", &num);
    printf("&pa = %p\n", &pa);
    printf("pa = %p\n", pa);
    printf("&pInt = %p\n", &pInt);
    printf("pInt = %p\n", pInt);
    printf("&ic = %p\n", &ic);
    printf("&pstr = %p\n", &pstr);
    printf("pstr = %p\n", pstr);
    printf("&\"hello,world\" = %p\n", &"hello,world");
    //函数名是函数的入口地址，数组名是数组的入口地址
    printf("&main = %p\n", &main);
    printf("main = %p\n", main);
    printf("&icc = %p\n", &icc);
    printf("&icc2 = %p\n", &icc2);

    printf("\n部分变量的值\n");
    printf("gNum = %d\n", gNum);
    printf("num = %d\n", num);

    delete pInt;//手动回收
    /* pInt = NULL;//C的写法,在C++11以及之后，不推荐NULL */
    //C++11 nullptr
    //#define void * nullptr
    pInt = nullptr;//C++11的写法，更推荐使用

    //继续使用pInt的时候

    return 0;
}

